package data

import (
	"context"

	"github.com/go-kratos/kratos/v2/log"

	"poetize/app/service/sys_config/internal/biz"
)

// userRepo 实现 biz.UserRepo 接口
// 私有的结构体
// 对“/biz/user.go”中的UserRepo进行实现，
// 完成对“用户数据模型”的数据库基础操作。
type configRepo struct {
	data *Data // 数据库客户端的集合
	log  *log.Helper
}

// NewConfigRepo .
// 注意这里返回的是 biz.ConfigRepo
// 在golang中接口的继承是不需要明确声明的
// 只要我们的私有结构体userRepo实现了“/biz/sys_config.go”内 biz.ConfigRepo 接口内的方法
// 那么 userRepo 就是“继承”了 biz.ConfigRepo
func NewConfigRepo(data *Data, logger log.Logger) biz.ConfigRepo {
	return &configRepo{
		data: data,
		log:  log.NewHelper(logger),
	}
}

// CreateConfig 创建配置的数据
// model 为配置数据模型
func (c configRepo) CreateConfig(ctx context.Context, model *biz.ConfigSave) (uint, error) {
	// 使用 “/data/date.go”中的 “Data”结构体内的 “DataBase *gorm.DB”数据库客户端在数据库中创建一个“配置数据”
	err := c.data.DataBase.Save(model).Error
	// 如果存在错误，则将错误返回
	if err != nil {
		return 0, err
	}
	// 如果没有发生错误，则返回创建成功后的用户id
	return uint(model.Id), nil
}

func (c configRepo) DeleteConfig(ctx context.Context, model *biz.ConfigSave) (uint, error) {
	err := c.data.DataBase.Delete(model).Error
	if err != nil {
		return 0, err
	}
	// 如果没有发生错误，则返回删除成功后的配置id
	return uint(model.Id), nil
}

func (c configRepo) ListConfig(ctx context.Context, model *biz.ConfigSave, size int, page int) ([]biz.ConfigSave, error) {
	AllConfigs := make([]biz.ConfigSave, 0)
	if size == 0 {
		size = 5
	}
	if page == 0 {
		page = 1
	}
	var num int64
	c.data.DataBase.Model(biz.ConfigSave{}).Count(&num)
	if page > int(num) {
		page = int(num)
	}
	offset := (page - 1) * size
	err := c.data.DataBase.Offset(offset).Limit(size).Find(&AllConfigs).Error
	if err != nil {
		return nil, err
	}
	return AllConfigs, nil
}
